﻿using System;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace TransporteAgua
{
    public partial class frmOperadores : Form
    {
        Database datos;
        string[] llavesOperador, operadores;
        int key;
        bool agregando, modificando;
        TabPage saveFiltro;
        frmPrincipal parent;

        public frmOperadores(Database db, frmPrincipal dad)
        {
            datos = db;
            InitializeComponent();
            saveFiltro = grpFiltros;
            lstOperadores.Items.Clear();
            cmbOrden.SelectedIndex = 1;
            mostrando();
            parent = dad as frmPrincipal;
        }
        private void obtenerListaOperadores()
        {
            string filtro = generarFiltro();
            try
            {
                int numResultados = datos.contar("operadores", filtro);
                llavesOperador = datos.getColumn("id", "operadores", filtro, cmbOrden.Text, numResultados);
                operadores = datos.getColumn("nombre", "operadores", filtro, cmbOrden.Text, numResultados);
                lstOperadores.Items.Clear();
                foreach (string op in operadores)
                    lstOperadores.Items.Add(op);
            }
            catch (MySqlException e)
            {
                MessageBox.Show(e.Message, "Error de base de datos!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private string generarFiltro()
        {
            string filtroNombre = "", filtroDomicilio = "", filtroTelefono = "";
            if (chkFNombre.Checked) filtroNombre = txtFiltroNombre.Text + "%";
            if (chkFDomicilio.Checked) filtroDomicilio = txtFiltroDomicilio.Text + "%";
            if (chkFTelefono.Checked) filtroTelefono = txtFiltroTelefono.Text + "%";
            return "WHERE nombre LIKE '%" + filtroNombre + "%' AND domicilio LIKE '%" + filtroDomicilio + "%' AND telefono LIKE '%" + filtroTelefono + "%'";
        }
        private void chkNombre_CheckedChanged(object sender, EventArgs e)
        {
            txtFiltroNombre.Enabled = chkFNombre.Checked;
            obtenerListaOperadores();
        }
        private void chkDomicilio_CheckedChanged(object sender, EventArgs e)
        {
            txtFiltroDomicilio.Enabled = chkFDomicilio.Checked;
            obtenerListaOperadores();
        }
        private void chkTelefono_CheckedChanged(object sender, EventArgs e)
        {
            txtFiltroTelefono.Enabled = chkFTelefono.Checked;
            obtenerListaOperadores();
        }
        private void txtFiltroNombre_TextChanged(object sender, EventArgs e)
        {
            obtenerListaOperadores();
        }
        private void txtFiltroDomicilio_TextChanged(object sender, EventArgs e)
        {
            obtenerListaOperadores();
        }
        private void txtFiltroTelefono_TextChanged(object sender, EventArgs e)
        {
            obtenerListaOperadores();
        }

        private void lstOperadores_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lstOperadores.SelectedIndex >= 0)
                llenarCampos(datos.getRow(llavesOperador[lstOperadores.SelectedIndex], "operadores"));
            tabControl.SelectedIndex = 0;
        }
        private void llenarCampos(string[] datos)
        {
            txtID.Text = datos[0];
            txtNombre.Text = datos[1];
            txtDomicilio.Text = datos[2];
            txtTelefono.Text = datos[3];
            txtCelular.Text = datos[4];
            txtObservaciones.Text = datos[5];
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            key = lstOperadores.SelectedIndex;
            agregar();
            foreach (Control c in grpDetalles.Controls)
                if (c is TextBox) c.Text = "";
            lstOperadores.SelectedIndex = -1;
            txtID.Text = "Asignado automaticamente...";
        }
        private void btnModificar_Click(object sender, EventArgs e)
        {
            if (lstOperadores.SelectedIndex < 0) MessageBox.Show("Debes seleccionar un operador", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            else
            {
                key = lstOperadores.SelectedIndex;
                modifica();
            }
        }
        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (lstOperadores.SelectedIndex < 0) MessageBox.Show("Debes seleccionar un operador", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            else
            {
                string name = txtNombre.Text;
                DialogResult res = MessageBox.Show("Estas a punto de eliminar a " + name + " de la base de datos.\n¿Estas seguro que deseas hacerlo?", "Eliminar", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
                if (res == DialogResult.Yes)
                {
                    datos.eliminar("operadores", txtID.Text);
                    obtenerListaOperadores();
                    if (lstOperadores.Items.Count > 0) lstOperadores.SelectedIndex = 0;
                    MessageBox.Show("El operador " + name + " se ha eliminado", "Base de datos", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }
        private void agregar()
        {
            btnAgregar.Enabled = btnModificar.Enabled = btnEliminar.Enabled = false;
            btnAceptar.Visible = btnCancelar.Visible = true;
            foreach (Control c in grpDetalles.Controls)
            readOnlyTexbox(false);
            if (tabControl.TabCount == 2) tabControl.TabPages.RemoveAt(1);            
            agregando = true;
        }
        private void mostrando()
        {
            btnAgregar.Enabled = btnModificar.Enabled = btnEliminar.Enabled = true;
            btnAceptar.Visible = btnCancelar.Visible = false;
            readOnlyTexbox(true);
            if (tabControl.TabCount == 1) tabControl.TabPages.Add(saveFiltro);           
        }
        private void modifica()
        {
            btnAgregar.Enabled = btnModificar.Enabled = btnEliminar.Enabled = false;
            btnAceptar.Visible = btnCancelar.Visible = true;
            readOnlyTexbox(false);
            if (tabControl.TabCount == 2) tabControl.TabPages.RemoveAt(1);            
            modificando = true;
        }
        private void readOnlyTexbox(bool valor) {
            foreach (Control c in grpDetalles.Controls)
                if (c is TextBox)
                {
                    TextBox txt = (TextBox)c;
                    txt.ReadOnly = valor;
                }
        }
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            string[] campos = { "nombre", "domicilio", "telefono", "celular", "observaciones" };
            string[] valores = { txtNombre.Text, txtDomicilio.Text, txtTelefono.Text, txtCelular.Text, txtObservaciones.Text };
            try
            {
                if (agregando)
                {
                    string newid = datos.agregar("operadores", campos, valores);
                    obtenerListaOperadores();
                    mostrando();
                    for (int i = 0; i < llavesOperador.Length; i++)
                        if (llavesOperador[i].Equals(newid))
                        {
                            lstOperadores.SelectedIndex = i;
                            break;
                        }
                    MessageBox.Show("Operador agregado!", "Base de datos", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    agregando = false;
                }
                else if (modificando)
                {
                    string key = llavesOperador[lstOperadores.SelectedIndex];
                    datos.modificar("operadores", key, campos, valores);
                    obtenerListaOperadores();
                    mostrando();
                    for (int i = 0; i < llavesOperador.Length; i++)
                        if (llavesOperador[i].Equals(key))
                        {
                            lstOperadores.SelectedIndex = i;
                            break;
                        }
                    MessageBox.Show("Operador modificado", "Base de datos", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    modificando = false;
                }
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.Message, "Error de base de datos!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            mostrando();
            chkFNombre.Checked = chkFDomicilio.Checked = chkFTelefono.Checked = false;
            lstOperadores.SelectedIndex = key;
            agregando = false;
            modificando = false;
        }
        private void cmbOrden_SelectedIndexChanged(object sender, EventArgs e)
        {
            obtenerListaOperadores();
        }
        public void activarSeleccionar()
        {
            btnSeleccionar.Visible = true;
        }
        private void frmOperadores_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            btnSeleccionar.Visible = false;
            Hide();
        }

        private void btnSeleccionar_Click(object sender, EventArgs e)
        {
            string[] datos = { txtID.Text, txtNombre.Text, txtDomicilio.Text, txtTelefono.Text, txtCelular.Text, txtObservaciones.Text };
            parent.enviarPedido.llenarOperadores(datos);
            btnSeleccionar.Visible = false;
            Hide();
        }
    }
}
